home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperPC 2
/
HyperPC 2 - Disc 1.iso
/
18_厳選!オンラインソフト130
/
セレクション
/
wavgp13c.lzh
/
wg
/
dllsrc.lzh
/
e1.cpp
next >
Wrap
C/C++ Source or Header
|
1999-04-14
|
6KB
|
276 lines
#define STRICT
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <commctrl.h>
#include <mem.h>
#include <math.h>
#include "wg_data.h"
#include "wg_back.h"
#include "e1.rh"
#ifndef EXIMPORT
#define EXIMPORT _import
#endif
#include "wgfunc.h"
WGDATA wgData;
HINSTANCE hDLL;
int nResult;
struct {
int time; // 遅れ時間
int g; // 減衰率
int n; // 繰り返し回数
bool f; // 対象 (f = false : 現在のチャンネル true : 全てのチャンネル)
} Info;
extern "C" {
int WINAPI _export ExecuteFunc(WGDATA *d);
LPCSTR WINAPI _export WGInfo();
}
// ダイアログボックスの初期設定
void InitDlg(HWND hwnd)
{
InitCommonControls();
short n = wgData.Current;
if (wgData.data[n-1].nChannels > 1) {
CheckDlgButton(hwnd,IDC_RADIOBUTTON2,1);
}
else {
EnableWindow(GetDlgItem(hwnd,IDC_RADIOBUTTON1),false);
EnableWindow(GetDlgItem(hwnd,IDC_RADIOBUTTON2),false);
}
}
// ダイアログボックスクローズ
void EndDlg(HWND hwnd)
{
Info.f = true;
if (IsDlgButtonChecked(hwnd,IDC_RADIOBUTTON1) == 1) Info.f = false;
if (wgData.data[wgData.Current-1].nChannels == 1) Info.f = false;
BOOL flag;
Info.time = GetDlgItemInt(hwnd,IDC_EDIT1,&flag,true);
Info.g = GetDlgItemInt(hwnd,IDC_EDIT2,&flag,true);
Info.n = GetDlgItemInt(hwnd,IDC_EDIT3,&flag,true);
}
#pragma argsused
BOOL CALLBACK _export DlgDLLProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
BOOL r = true;
switch (msg) {
case WM_INITDIALOG:
nResult = 0;
InitDlg(hwnd);
break;
case WM_CLOSE:
EndDialog(hwnd,nResult);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
nResult = IDOK;
EndDlg(hwnd);
case IDCANCEL:
PostMessage(hwnd,WM_CLOSE,0,0);
break;
default: r = false;
}
break;
case WM_NOTIFY:
{ // UpDown
HWND hWnde = 0;
if ((int)wParam == IDC_MSCTLS_UPDOWN1) hWnde = GetDlgItem(hwnd,IDC_EDIT1);
if ((int)wParam == IDC_MSCTLS_UPDOWN2) hWnde = GetDlgItem(hwnd,IDC_EDIT2);
if ((int)wParam == IDC_MSCTLS_UPDOWN3) hWnde = GetDlgItem(hwnd,IDC_EDIT3);
if (!hWnde) break;
char s[256];
NM_UPDOWN* ud = (NM_UPDOWN *)lParam;
GetWindowText(hWnde,s,255);
int n = atoi(s);
n -= ud->iDelta;
if (n<0) n = 0;
sprintf(s,"%d",n);
SetWindowText(hWnde,s);
}
break;
default: r = false;
}
return(r);
}
int check(int d,WORD b)
{
if (d < 0) d = 0;
if (b == 8) {
if (d > 255) d = 255;
}
else
if (d > 65535) d = 65535;
return(d);
}
// エコー
int effect()
{
int r = wgData.Current;
WaveData* waveData[2];
WaveData* waveTmp;
short c = wgData.Current;
c--;
// 対象になる領域を決める
UINT x1 = wgData.data[c].x1;
UINT x2 = wgData.data[c].x2;
if (x1==x2) x2 = wgData.data[c].nData-1;
// データを待避させるためのオブジェクト
waveTmp = new WaveData();
if (!waveTmp->Make(x2 - x1 + 1,
wgData.data[c].nBits,
1,
wgData.data[c].nDataPerSec) ) {
delete waveTmp;
return 0;
}
// WaveData クラスでデータを扱う
for (int i=0;i<=1;i++) {
waveData[i] = new WaveData();
waveData[i]->data = wgData.data[i].data;
waveData[i]->NumberOfData = wgData.data[i].nData;
waveData[i]->NumberOfDataPerSec = wgData.data[i].nDataPerSec;
waveData[i]->NumberOfChannels = wgData.data[i].nChannels;
waveData[i]->bit = wgData.data[i].nBits;
}
// 0
int average = (wgData.data[c].nBits == 8) ? 128 : 32768;
// 処理するチャンネル
WORD ch1,ch2;
if (Info.f) {
ch1 = 0;
ch2 = waveData[c]->NumberOfChannels;
ch2--;
}
else {
ch1 = wgData.data[c].currentChannel;
ch1--;
ch2 = ch1;
}
// Undoバッファに待避
WGBACK wgBack;
wgBack.n = wgData.Current;
wgBack.fCh = Info.f;
wgBack.x1 = x1;
wgBack.x2 = x2;
SendMessage(wgData.hwnd,WM_WG_BACK,0,(LPARAM)&wgBack);
// 処理
UINT time;
UINT xLate;
for (WORD ch=ch1;ch<=ch2;ch++) {
for (UINT i=x1;i<=x2;i++) {
waveTmp->DataWrite(i-x1,0,waveData[c]->DataRead(i,ch));
}
for (int n=1;n<=Info.n;n++) {
time = (UINT)( (double)Info.time * (double)waveData[c]->NumberOfDataPerSec / 1000.0);
for (UINT i=x1;i<=x2;i++) {
xLate = i+time*n;
if (xLate > x2) break;
waveData[c]->DataWrite(xLate,ch,
check(waveData[c]->DataRead(xLate,ch) +
(int)( (double)(waveTmp->DataRead(i-x1,0) - average)*pow((double)Info.g/100.0,n) ) ,
waveData[c]->bit));
}
}
}
// 後片付け
for (int i=0;i<=1;i++) {
waveData[i]->data = 0; // 0にしておかないとデストラクタで削除される
delete waveData[i];
}
delete waveTmp;
return r;
}
// WaveGraphが実行する関数
int WINAPI _export ExecuteFunc(WGDATA *d)
{
int r = 0;
// ダイアログボックス表示してエフェクトの条件を決める
memcpy(&wgData,d,sizeof(wgData));
DLGPROC dlgproc1 = (DLGPROC)MakeProcInstance(DlgDLLProc,hDLL);
if (DialogBox(hDLL,MAKEINTRESOURCE(IDD_DIALOG1),wgData.hwnd,dlgproc1)) {
HCURSOR hPrevious = SetCursor(LoadCursor(NULL,IDC_WAIT));
r = effect(); // 条件にしたがってエフェクトの処理を行う
SetCursor(hPrevious);
}
FreeProcInstance((FARPROC)dlgproc1);
// ExecuteFunc が終了したとき画面を更新するウインドウを指定
//
// r = 1 : Window1更新
// r = 2 : Window2更新
// r = 3 : 全て更新
return r;
}
// 処理の名前
LPCSTR WINAPI _export WGInfo()
{
return "エコー";
}
#pragma argsused
BOOL WINAPI _export DllEntryPoint( HINSTANCE hinstDll, DWORD fdwRreason, LPVOID plvReserved)
{
if ((fdwRreason == DLL_PROCESS_ATTACH) || (fdwRreason == DLL_THREAD_ATTACH)) hDLL = hinstDll;
return true;
}